package TarryDAOS;

import Herramientas.Herramientas;
import Herramientas.PasarelaDatos;
import Herramientas.ResultSets;
import TarryDTOS.ImpuestosDTO;
import TarryDTOS.ItemReporteDTO;
import TarryDTOS.TarryItemPedidoDTO;
import TarryDTOS.TarryPedidosDTO;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Mauricio Alan
 */
public class TarryItemsPedidoDAO {

    private PasarelaDatos db;
    private ResultSets res;

    public TarryItemsPedidoDAO() {
        db = new PasarelaDatos();
        res = new ResultSets();
    }

    /**
     * ALAN GONZALEZ DETERMINA LA SUMA TOTAL DE TODOS SUS ITEMS
     *
     * @param idPedido
     * @return
     */
    public double totalItemsPedido(int idPedido) {
        double suma = 0.0;
        db.openDatabase();
        String query = "SELECT SUM(items_pedido.total_item_ieps) as totalItem FROM items_pedido where id_pedido= " + idPedido;
        ResultSet rst = db.executeQuery(query);
        try {
            if (rst.next()) {
                suma = rst.getDouble("totalItem");
            } else {
                suma = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryItemsPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return suma;
    }

    /**
     * ALAN GONZALEZ NUEVO REGISTRO DE UN ITEM DE PEDIDO CON CALCULOS
     * AUTOMATIZADOS DESDE EL CATALOGO PRODUCTOS
     *
     * @param item
     */
    public void agregarItemPedido(TarryItemPedidoDTO item) {
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();
        Herramientas herramientas = new Herramientas();
        db.openDatabase();
        double itemSubtotal = item.getCantidadCorrugados() * item.getPrecionAsignadoCorrugado();
        item.setSubtotalCorrugados(itemSubtotal);

        String query = "INSERT INTO items_pedido SET ";
        query += " id_pedido =" + item.getIdPedido();
        query += ", id_producto =" + item.getIdProducto();
        query += ", cantidad_corrugados =" + item.getCantidadCorrugados();
        query += ", precio_asigando_corrugado =" + item.getPrecionAsignadoCorrugado();
        query += ", subtotal_corrugados =" + (+item.getSubtotalCorrugados());
        query += ", descuento_asignado_uno  =" + item.getDescuentoItem1();
        query += ", descuento_asignado_dos  =" + item.getDescuentoItem2();
        query += ", descuento_asignado_tres =" + item.getDescuentoItem3();

// # CALCULO DEL IEPS DINAMICO
        ProductosVentaDAO productosVentaDAO = new ProductosVentaDAO();
        int banderaIEPS = productosVentaDAO.productoIEPS(item.getId());
        ImpuestosDAO impuestosDAO = new ImpuestosDAO();
        ImpuestosDTO impuestosDTO = new ImpuestosDTO();
        impuestosDTO = impuestosDAO.configuracionImpuestos();
        double porcentajeIEPS = impuestosDTO.getIeps();

// # NO HAY DESCUENTOS
        if (item.getDescuentoItem1() == 0 && item.getDescuentoItem2() == 0 && item.getDescuentoItem3() == 0) {
            query += ", total_item =" + item.getSubtotalCorrugados();

// # SE AGREGA EL IEPS << EN CASO DE QUE EL PEDIDO REQUIERA FACTURA >>
// 1 = REMISION NO SE AGREGA IEPS AL ITEM SE ESCRIBE EL MISMO TOTAL
            int tipoComprobante = pedidosDAO.tipoComprobante(item.getIdPedido());
            if (tipoComprobante == 1) {
                query += ", total_item_ieps=" + item.getSubtotalCorrugados();

// 2 = FACTURA  SI SE AGREGA IEPS AL ITEM
            } else if (tipoComprobante == 2) {
                double total = herramientas.totalItemIEPS(item.getSubtotalCorrugados(), porcentajeIEPS);
                query += ", total_item_ieps =" + total;
            }

        } else // # DESCUENTO UNITARIO
        if (item.getDescuentoItem1() > 0 && item.getDescuentoItem2() == 0 && item.getDescuentoItem3() == 0) {
            double descuentoUnitario = herramientas.descuentoUnitario(item.getSubtotalCorrugados(), item.getDescuentoItem1());
            query += ", total_item =" + descuentoUnitario;

// # SE AGREGA EL IEPS << EN CASO DE QUE EL PEDIDO REQUIERA FACTURA >>
            // 1 = REMISION NO SE AGREGA IEPS AL ITEM SE ESCRIBE EL MISMO TOTAL
            int tipoComprobante = pedidosDAO.tipoComprobante(item.getIdPedido());
            if (tipoComprobante == 1) {
                query += ", total_item_ieps=" + descuentoUnitario;
                // 2 = FACTURA  SI SE AGREGA IEPS AL ITEM
            } else if (tipoComprobante == 2) {
                double total = herramientas.totalItemIEPS(descuentoUnitario, porcentajeIEPS);
                query += ", total_item_ieps =" + total;
            }
        }

// # DESCUENTO DOBLE ENCADENADO
        if (item.getDescuentoItem1() > 0 && item.getDescuentoItem2() > 0 && item.getDescuentoItem3() == 0) {
            double descuentoDoble = herramientas.descuentoEncadenadoDoble(item.getSubtotalCorrugados(), item.getDescuentoItem1(), item.getDescuentoItem2());
            query += ", total_item =" + descuentoDoble;

// # SE AGREGA EL IEPS << EN CASO DE QUE EL PEDIDO REQUIERA FACTURA >>
            // 1 = REMISION NO SE AGREGA IEPS AL ITEM SE ESCRIBE EL MISMO TOTAL
            int tipoComprobante = pedidosDAO.tipoComprobante(item.getIdPedido());
            if (tipoComprobante == 1) {
                query += ", total_item_ieps=" + descuentoDoble;
                // 2 = FACTURA  SI SE AGREGA IEPS AL ITEM
            } else if (tipoComprobante == 2) {
                double total = herramientas.totalItemIEPS(descuentoDoble, porcentajeIEPS);
                query += ", total_item_ieps =" + total;
            }
        }

// # DESCUENTO TRIPLE ENCADENADO
        if (item.getDescuentoItem1() > 0 && item.getDescuentoItem2() > 0 && item.getDescuentoItem3() > 0) {
            double descuentoTriple = herramientas.descuentoEncadenadoTriple(item.getSubtotalCorrugados(), item.getDescuentoItem1(), item.getDescuentoItem2(), item.getDescuentoItem3());
            query += ", total_item =" + descuentoTriple;

// # SE AGREGA EL IEPS << EN CASO DE QUE EL PEDIDO REQUIERA FACTURA >>
            // 1 = REMISION NO SE AGREGA IEPS AL ITEM SE ESCRIBE EL MISMO TOTAL
            int tipoComprobante = pedidosDAO.tipoComprobante(item.getIdPedido());
            if (tipoComprobante == 1) {
                query += ", total_item_ieps=" + descuentoTriple;
                // 2 = FACTURA  SI SE AGREGA IEPS AL ITEM
            } else if (tipoComprobante == 2) {
                double total = herramientas.totalItemIEPS(descuentoTriple, porcentajeIEPS);
                query += ", total_item_ieps =" + total;
            }
        }

        db.execute(query);
        db.closeDatabase();

// ACTUALIZACION DEL PEDIDO
        pedidosDAO.actualizarSubtotal(item.getIdPedido(), this.totalItemsPedido(item.getIdPedido()));
        pedidosDAO.actualizarNumeroItems(item.getIdPedido());
// ACTUALIZACION DEL PEDIDO
    }

    /**
     * ALAN GONZALEZ ELIMINA ITEM DE PEDIDO
     *
     * @param idPedido
     * @param idReg
     */
    public void eliminarItemPedido(int idPedido, int idReg) {
        db.openDatabase();
        String query = "DELETE FROM items_pedido where items_pedido.id=" + idReg;
        db.execute(query);
        db.closeDatabase();
        // ACTUALIZACION DEL PEDIDO
        TarryPedidosDAO pedidosDAO = new TarryPedidosDAO();
        pedidosDAO.actualizarSubtotal(idPedido, this.totalItemsPedido(idPedido));
        // ACTUALIZACION DEL PEDIDO
    }

    /**
     * ALAN GONZALEZ SELECCIONA TODOS LOS ITEMS PRODUCTO DE UN ID DE PEDIDO
     *
     * @param idPedido
     * @return
     */
    public Vector itemsPorPedido(int idPedido) {
        Vector itms = new Vector();
        String query = "SELECT * from items_pedido where items_pedido.id_pedido = " + idPedido;
        db.openDatabase();
        ResultSet rst = db.executeQuery(query);
        try {
            while (rst.next()) {
                TarryItemPedidoDTO t = new TarryItemPedidoDTO();
                t = res.tarryItemPedidoDTO(rst);
                itms.add(t);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryItemsPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return itms;
    }

    /**
     * ALAN GONZALEZ SUMA TOTAL DE LOS ITEMS AGREGADOS EN UN PEDIDO
     *
     * @param idPedido
     * @return
     */
    public double totalItems(int idPedido) {
        double suma = 0.0;
        db.openDatabase();
        String query = "SELECT SUM(items_pedido.total_item_ieps) AS suma FROM items_pedido WHERE id_pedido= " + idPedido;
        ResultSet rst = db.executeQuery(query);
        try {
            if (rst.next()) {
                suma = rst.getDouble("suma");
            } else {
                suma = 0.0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryItemsPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return suma;
    }

    /**
     * ALAN GONZALEZ ELIMINA TODOS LOS ITEMS DE UN PEDIDO
     *
     * @param idPedido
     */
    public void eliminarTodosItemsPedido(int idPedido) {
        db.openDatabase();
        String query = "DELETE FROM items_pedido WHERE items_pedido.id_pedido=" + idPedido;
        db.execute(query);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ PIEZAS SOLICITADAS PRODUCTO ESTE METODO DEVUELVE EN ENTERO
     * EL NUMERO DE CAJAS SOLICITADAS DE UN PRODUCTO DETERMINADO EN UN PEDIDO
     * DETERMINADO
     *
     * @param idPedido
     * @param id
     * @return
     */
    public int piezasSolicitadasProducto(int idPedido, int idProducto) {
        int numeroPiezas = 0;
        db.openDatabase();
        String sql = " select";
        sql += " items_pedido.id_producto as PRODCUTO_CAJAS,";
        sql += " items_pedido.cantidad_corrugados as CANTIDAD_CAJAS";
        sql += " from ";
        sql += " items_pedido ";
        sql += " where ";
        sql += " items_pedido.id_pedido =  " + idPedido;
        sql += " and ";
        sql += " items_pedido.id_producto= " + idProducto;
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                numeroPiezas = rst.getInt("CANTIDAD_CAJAS");
            } else {
                numeroPiezas = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryItemsPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return numeroPiezas;
    }

    /**
     * ALAN GONZALEZ | ESTE METODO CAMBIA EL ESTADO DE LA BANDERA DEL PRODUCTO
     * >|1 SURTIDO CON EXISTENCIAS |2 ENVIADOR A PRODUCCION |3 ENVIADO A
     * PRODUCCION POR EXISTENCIA INSUFICIENTE
     *
     * @param idregistro
     * @param idPedido
     * @param idProducto
     */
    public void cambioEstadoProductoPedido(int idregistro, int idPedido, int idProducto) {

    }

    /**
     * ALAN GONZALEZ | METODO QUE DEVUELVE UN SOLO PEDIDO SELECCIONADO POR SU ID
     *
     * @param idCliente
     * @return
     */
    public TarryPedidosDTO unPedidoPorId(int pedidoID) {
        TarryPedidosDTO pedido = new TarryPedidosDTO();
        String sql = "SELECT * FROM pedidos  WHERE pedidos.id_pedido =" + pedidoID;
        db.openDatabase();

        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                pedido = res.tarryPedidosDTO(rst);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryItemsPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return pedido;
    }

    /**
     * ALAN GONZALEZ | METODO PARA ACTUALIZAR LAS BANDERAS DE LOS ITEMS SEGUN EL
     * ID DE ITEM TABLA Y TIPO DE BANDERA
     *
     * @param idItem
     */
    public void actualizarBanderaEstadoItem(int idItem, int banderaEstado) {
        String sql = "";
        sql += " UPDATE items_pedido SET";
        sql += " items_pedido.bandera_estado = " + banderaEstado;
        sql += " WHERE";
        sql += " items_pedido.id = " + idItem;
        db.openDatabase();
        db.execute(sql);
        db.closeDatabase();
    }

    /**
     * ALAN GONZALEZ - METODO PARA OBTENER EL ID DE UN ITEM REGISTRADO
     *
     * @param idPedido
     * @param idProducto
     * @return
     */
    public int idRegistroItemPedido(int idPedido, int idProducto) {
        int idRegistro = 0;
        String sql = "";
        sql += " SELECT ";
        sql += " items_pedido.id";
        sql += " FROM ";
        sql += " items_pedido ";
        sql += " WHERE";
        sql += " items_pedido.id_pedido = " + idPedido;
        sql += " AND";
        sql += " items_pedido.id_producto = " + idProducto;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                idRegistro = rst.getInt("id");
            } else {
                idRegistro = 0;
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryItemsPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return idRegistro;
    }

    /**
     * ALAN GONZALEZ | ESTE METODO DEVUELVE UNA BANDERA PARA SABER SI EXISTE EL
     * REGISTRO DE UN PRODUCTO DETERMINADO DENTRO DE UN PEDIDO DETERMINADO
     *
     * @param idPedido
     * @param idProducto
     * @return
     */
    public int banderaExisteItemProducto(int idPedido, int idProducto) {
        int bandera = 0;
        String sql = "";
        sql += " SELECT COUNT(*) as total FROM items_pedido ";
        sql += " WHERE";
        sql += " items_pedido.id_pedido = " + idPedido;
        sql += " AND";
        sql += " items_pedido.id_producto =" + idProducto;
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                bandera = rst.getInt("total");
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryItemsPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return bandera;
    }

    /**
     * ALAN GONZALEZ ESTE METODO DEVUELVE UN VECTOR CON TODOS LOS PRODUCTOS CON
     * ESTADO DE SER PRODUCIDOS
     *
     * @return
     */
    public Vector itemsParaPoduccion() {
        Vector vItemsProduccion = new Vector();
        String sql = "SELECT * FROM items_pedido WHERE items_pedido.bandera_estado = 2";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while (rst.next()) {
                TarryItemPedidoDTO item = new TarryItemPedidoDTO();
                item = res.tarryItemPedidoDTO(rst);
                vItemsProduccion.add(item);
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryItemsPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return vItemsProduccion;
    }

    
    /**
     * ALAN GONZALEZ ESTE METODO SEGUN UNA BANDERA DEVUELVE LOS DATOS ESTALECIDOS
     *  1: TOTAL DE PRODUCTOS DISTINTOS
     *  2: TOTAL DE PRODUCTOS DISTINTOS SURTIDOS
     *  3: TOTAL DE PRODUCTOS DISTINTOS NO SURTIDOS
     *  4: PORCENTAJE DE AVANCE
     *  5: PORCENTAJE RESTANTE
     * @param idPedido
     * @param bandera
     * @return 
     */
    public double estadisticaPedido(int idPedido, int bandera) {
        double dato = 0;

        String sql = "";

        sql += " SELECT ";
        sql += " COUNT(*) as totalItemsPedido, ";
        sql += " (SELECT COUNT(*) FROM items_pedido where items_pedido.id_pedido = "+idPedido+" AND items_pedido.bandera_estado = 1 ) as totalItemsPedidoSurtidos, ";
        sql += " (SELECT COUNT(*) FROM items_pedido where items_pedido.id_pedido = "+idPedido+" AND items_pedido.bandera_estado = 2 ) as totalItemsPedidoProduccion, ";
        sql += " ((((SELECT COUNT(*) FROM items_pedido where items_pedido.id_pedido = "+idPedido+" AND items_pedido.bandera_estado = 1 )*100) / (select COUNT(*) FROM items_pedido WHERE items_pedido.id_pedido = "+idPedido+" ))) as porcentajeAvance, ";
        sql += " ((((SELECT COUNT(*) FROM items_pedido where items_pedido.id_pedido = "+idPedido+" AND items_pedido.bandera_estado = 2 )*100) / (select COUNT(*) FROM items_pedido WHERE items_pedido.id_pedido = "+idPedido+" ))) as porcentajeRestante ";
        sql += " FROM items_pedido WHERE items_pedido.id_pedido = "+idPedido+";";

        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            if (rst.next()) {
                switch (bandera) {
                    case 1:
                        dato = rst.getDouble("totalItemsPedido"); // NUMERO DE PRODUCTOS DISTINTOS DENTRO DE UN PEDIDO
                        break;
                    case 2:
                        dato = rst.getDouble("totalItemsPedidoSurtidos"); // NUMERO DE PRODUCTOS DISTINTOS QUE SE HAN SURTIDO DENTRO DEL PEDIDO
                        break;
                    case 3:
                        dato = rst.getDouble("totalItemsPedidoProduccion"); // NUMERO DE PRODUCTOS DISTINTOS QUE SE HAN ENVIADO A PRODUCCION
                        break;
                    case 4:
                        dato = rst.getDouble("porcentajeAvance"); // PORCENTAJE DE AVANCE DEL PEDIDO RESPECTO A LO QUE SE HA SURTIDO
                        break;
                    case 5:
                        dato = rst.getDouble("porcentajeRestante"); // PORCENTAJE DE RESTANTE DEL PEDIDO RESPECTO A LO QUE FALTA POR SURTIRSE
                        break;
                }
            } else {
                dato = 0; // PORCENTAJE DE RESTANTE DEL PEDIDO RESPECTO A LO QUE FALTA POR SURTIRSE
            }
        } catch (SQLException ex) {
            Logger.getLogger(TarryItemsPedidoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return dato;

    }
    
 /**
     * ALAN GONZALEZ
     *
     * @param idPedido
   
    1   |
        |   turn
     */
    public Vector productosReporte(int idPedido) {
        Vector prod = new Vector();
        String sql = new String();
        sql += " SELECT ";
        sql += " items_pedido.id_producto as clave, ";
        sql += " productos_venta.nombre_producto as nombre, ";
        sql += " items_pedido.cantidad_corrugados as cantidad";
        sql += " FROM ";
        sql += " items_pedido, productos_venta ";
        sql += " WHERE ";
        sql += " items_pedido.id_pedido = " + idPedido;
        sql += " AND";
        sql += " items_pedido.id_producto = productos_venta.id";
        db.openDatabase();
        ResultSet rst = db.executeQuery(sql);
        try {
            while(rst.next()){
            ItemReporteDTO itm = new ItemReporteDTO(); // crear la clase nueva con mismo nombre postfijo dto
            itm.setClave(rst.getInt("clave"));
            itm.setDescripcion(rst.getString("nombre"));
            itm.setCantidad(rst.getInt("cantidad"));
            prod.add(itm);
            }
        } catch (SQLException ex) {
            Logger.getLogger(CarteraVencidaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        db.closeDatabase();
        return prod;
    }
}
